home *** CD-ROM | disk | FTP | other *** search
/ Macworld Expo - Develope…Central & Net Innovations / Developer Central and Net Innovators (MacWorld Expo) (January 1999).iso / Developer Central / Metrowerks CodeWarrior / CodeWarrior Pro 4 Release Notes / Command-Line Tools Notes / MPW Tools Notes < prev   
Encoding:
Text File  |  1998-09-09  |  23.8 KB  |  725 lines  |  [TEXT/MPS ]

  1. ========================================================================
  2. Metrowerks MPW Tools Release Notes 
  3. ========================================================================
  4.  
  5. Version: 2.2 ( __MWERKS__ == 0x2200 )
  6. Date:    September 9, 1998
  7. Authors: Fred Peterson - MPW command line interface
  8.          Ed Swartz - MPW command line interface
  9.          Andreas Hommel - C/C++ frontends; Classic 68K backend and linker
  10.          Berardino Baratta - CFM68K backend and linker
  11.          Bob Campbell, Andy Nicholas - PPC backend
  12.  
  13. ========================================================================
  14.  
  15. The precompiled header files will have to be rebuilt.
  16.  
  17.  
  18. ========================================================================
  19. New Features in This Version
  20. ========================================================================
  21.  
  22. MWC68K and MWCPPC
  23. *  The interface for specifying optimizations has been changed.  The
  24.    new interface is based on levels numbered 0 through 4.  The new switches
  25.    are
  26.  
  27.     -opt l0                 # set global optimization level to 0
  28.     -opt l1                 # set global optimization level to 1
  29.     -opt l2                 # set global optimization level to 2
  30.     -opt l3                 # set global optimization level to 3
  31.     -opt l4                 # set global optimization level to 4
  32.  
  33.    These switches were previously in use in MWCPPC, but now they 
  34.    control more optimizations.  They also apply to MWC68K.
  35.    
  36.    You may still use the following switches, but they are deprecated.  
  37.    You should transition to using the -opt l[0-4] switches because these 
  38.    old switches are not guaranteed to work in future releases.
  39.  
  40.     -opt [no]global         # enable global optimizations
  41.     -opt [no]cse            # enable common sub expression optimization
  42.     -opt [no]deadcode       # enable removal of unreachable code
  43.     -opt [no]deadstore      # enable removal of dead assignments
  44.     -opt [no]lifetimes      # enable computation of variable lifetimes
  45.     -opt [no]loop           # enable removal of loop invariants
  46.     -opt [no]propagation    # enable propagation of constant and copy assignments
  47.     -opt [no]strength       # enable reduction of multiplication by an index variable
  48.                             #    to addition
  49.  
  50.    The following switches are deprecated only for MWCPPC:
  51.  
  52.     -opt [no]schedule601    # schedule instructions for 601
  53.     -opt [no]schedule603    # schedule instructions for 603
  54.     -opt [no]schedule603e   # schedule instructions for 603e
  55.     -opt [no]schedule604    # schedule instructions for 604
  56.     -opt [no]schedule604e   # schedule instructions for 604e
  57.     -opt [no]schedule750    # schedule instructions for 750
  58.  
  59.    Instead, you should use -opt schedule -processor generic|601|603|603e|604|604e|750.
  60.    The processor specification has been decoupled from the scheduling switch because
  61.    in the future other optimizations or compiler functionality may also depend on 
  62.    the processor.
  63.  
  64.    The following switches are deprecated only for MWC68K:
  65.  
  66.     -opt [no]color          # enable register coloring
  67.     -opt [no]peep           # enable peephole optimization
  68.  
  69.    Combining the new and old optimization switches can produce a usage warning:
  70.  
  71.     MWC68K source.c -opt nocolor,l4
  72.     ### MWC68K Usage Warning:
  73.     # '-opt l4' may override other previously specified optimization options
  74.  
  75.    Old options should be specified after the new options to be always effective
  76.    
  77.     MWC68K source.c -opt l4,nocolor
  78.    
  79.    There are pragmas to control some optimizations if needed. The 
  80.    following pragmas work for PowerPC, 68K and x86:
  81.    
  82.    #pragma opt_common_subs --> control common subexpression elimination
  83.    #pragma opt_loop_invariance --> control loop invariant removal
  84.    #pragma opt_propagation --> control copy and constant propagation
  85.    #pragma opt_lifetimes --> control lifetime analysis
  86.    #pragma opt_deadcode --> control dead code elimination
  87.    #pragma opt_dead_assignments --> remove dead assignments
  88.  
  89.    In addition there are 3 new powerpc specific pragmas which default
  90.    to the following (more details on these below).
  91.    
  92.    #pragma ppc_unroll_instructions_limit 100
  93.    #pragma ppc_unroll_factor_limit 10
  94.    #pragma ppc_unroll_speculative off
  95.  
  96. *  support for member templates
  97.  
  98.    Limitations:
  99.  
  100.       conversion member function templates are not supported
  101.  
  102.       member templates and member template members cannot be defined
  103.       outside of their class definition.
  104.  
  105.          Member template functions are not automatically inline unless
  106.          they are explicitly declared to be inlined. For example:
  107.  
  108.             struct X {
  109.                template <class T> void f(T) {};
  110.                template <class T> inline void g(T) {};
  111.  
  112.                template <class U> struct N {
  113.                   void h(U) {};
  114.                };
  115.             };
  116.  
  117.          only X::g and X::N::g are inlined but X::f will not be inlined.
  118.          This can be used to prevent coad bloat until out-of-line 
  119.          declarations are supported.
  120.  
  121. *  support for class template partial specializations
  122.  
  123. *  support for virtual function overrides with covariant return types:
  124.    
  125.       class foo {
  126.       public:
  127.          virtual const foo *func();
  128.       };
  129.  
  130.       class bar : public foo , public foo2 {
  131.       public:
  132.          virtual bar *func();   // OK, covariant return type
  133.       };
  134.  
  135. *  support for partial template function ordering
  136.  
  137. *  support for function-try-blocks
  138.  
  139. *  support for deferred code generation
  140.  
  141.       #pragma defer_codegen on|off|reset (default: off)
  142.  
  143.    This option allows inlining of 'inline' and 'auto-inline'
  144.    functions that are called before their definition:
  145.  
  146.         #pragma defer_codegen on
  147.         #pragma auto_inline on
  148.  
  149.         extern void f();
  150.         extern void g();
  151.  
  152.         main()
  153.         {
  154.             f();    // will be inlined
  155.             g();    // will be inlined
  156.         }
  157.  
  158.         inline void f() {}
  159.         void g() {}
  160.  
  161.    The compiler will need more memory when this option is selected.
  162.    The command line option is "-defer_codegen on|off".
  163.  
  164.  
  165. *  the ANSI C compiler now allows pointer -> pointer-size integral
  166.    conversions in global initializations if "ANSI strict" is not
  167.    selected.
  168.  
  169.       char c;
  170.       long arr = (long)&c;     // accepted (not ANSI C)
  171.  
  172. *  support for throwing exceptions in conditional expressions:
  173.  
  174.       int foo(bool cond)
  175.       {
  176.          return cond ? 1 : throw "oops";
  177.       }
  178.  
  179. *  an import / export __declspec after a class/struct keyword is now
  180.    also supported in non-Win ABI compilers.
  181.  
  182. *  the preprocessor now includes some info comments about the
  183.    current include file in preprocessor dumps. These comments can be
  184.    disabled via a '#pragma simple_prepdump on'.
  185.  
  186. *  support for two new built-in functions:
  187.  
  188.       primary_expression:
  189.          __builtin_align ( <type-id> )
  190.          __builtin_type ( <type-id> )
  191.  
  192.    '__builtin_align' returns the byte-alignment of <type-id>.
  193.    '__builtin_align' returns a type specific value (integral/enum: 0,
  194.    floating point: 1, other 2).
  195.  
  196. *  the size limit for fully expanded macros has been increased to 128K
  197.    characters (was 32K).
  198.  
  199. *  better code when class type exceptions are throw
  200.  
  201. *  improved template function inlining
  202.  
  203. *  updated linkage of 'inline' functions to latest specs
  204.  
  205. *  the 'implicit int' rule is no longer supported in C++
  206.  
  207.         f(int a)   //  error: implicit 'int'
  208.         {
  209.             return a+1;
  210.         }
  211.  
  212. *  #pragma suppress_init_code on|off|reset (default: off)
  213.  
  214.    This #pragma can be used to suppress any static data initialization
  215.    code generation (eg constructor calls). This should not be used
  216.    unless you really know what you are doing.
  217.  
  218. *  #pragma reverse_bitfields on|off|reset (default: off)
  219.  
  220.    This #pragma reverses the bitfield allocation.
  221.  
  222. *  The WinABI alignment #pragma (#pragma pack) and alignment modes
  223.    are now also supported the the MacOS PPC and 68K compilers.
  224.  
  225. *  obsolete #pragmas
  226.  
  227.     static_inlines 
  228.     direct_destruction 
  229.  
  230. *  New/changed  error messages:
  231.  
  232.    "inconsistent use of 'class' and 'struct' keywords"
  233.  
  234.     #pragma warn_structclass on | off | reset
  235.  
  236.       #pragma warn_structclass on
  237.       class X;
  238.       struct X { int a; }; // warning: inconsistent use...
  239.  
  240. ------
  241.  
  242.    "variable '%u' is not used in function",
  243.  
  244.       has been changed to:
  245.  
  246.    "variable / argument '%u' is not used in function",
  247.  
  248. ------
  249.  
  250.         /* [245] */
  251.         "illegal partial specialization",
  252.         /* [246] */
  253.         "illegal partial specialization argument list",
  254.         /* [247] */
  255.         "ambiguous use of partial specialization",
  256.         /* [248] */
  257.         "local classes shall not have member templates",
  258.         /* [249] */
  259.         "illegal template argument dependent expression",
  260.         /* [250] */
  261.         "implicit 'int' is no longer supported in C++",
  262.  
  263.  
  264. MWC68K
  265. *  #pragma huge_switch on | off | reset (default off)
  266.  
  267.    this #pragma can be used to avoid "label out of range error" in
  268.    functions with huge switch statements (>32K).
  269.  
  270. *  improved code generation
  271.  
  272.  
  273. MWCPPC
  274. *  Implement branchless compares which don't use the condition code
  275.    fields. These optmizations are explained in "The PowerPC(tm)
  276.    Compiler Writer's Guide" Appendix D (D.1 Comparisons and
  277.    Comparisons Aginst Zero)
  278.  
  279.    a = b == c;
  280.  
  281. *  Implement "!" with-out branches if the expression is not a "&&" or
  282.    "||". In effect "!" for a value in a register is the same as r == 0.
  283.    The code generated is:
  284.  
  285.    cntlwz Ry,Rvalue
  286.    srwi   Rresult,Ry
  287.  
  288. *  Check for the "!!" case (which sometimes happens with inlining)
  289.    !(!(x)) is the same as (x) iff x is a logical expression.
  290.  
  291. *  Optimize 16 or 8 bit math to remove the EXTS[HB] or RLWINM instructions
  292.    when it can be proven that they are not needed (LHZ does not need to be
  293.    followed by a RLWINM, and LHA does not need to be followed by a EXTSH
  294.    etc.)
  295.  
  296. *  Extensive Optimization Improvements
  297.    + Loop unrolling for fixed count loops has been extended to
  298.      handle loops where the body of the loop contains conditional
  299.      code.
  300.  
  301.    + Controls for loop unrolling have been make externally setable
  302.      using the pragmas "ppc_unroll_instructions_limit" and
  303.      "ppc_unroll_factor_limit". The default values for these are:
  304.  
  305.      #pragma ppc_unroll_instructions_limit 100
  306.      #pragma ppc_unroll_factor_limit 10
  307.  
  308.      The factor limit controls the max number of copies of the
  309.      loop body which will be generated. The instruction limit
  310.      controls the total size of the unrolled loop body. (It should
  311.      be noted that even if the limit is 100 the result will normally
  312.      be smaller as other optimizations generally will reduce the size
  313.      of the loop body after it has been unrolled).
  314.  
  315.    + Speculative unrolling, for a detected counting loop, where the
  316.      number of iterations is not a compile time constant but can
  317.      be calculated at runtime, the loop is speculatively unrolled.
  318.      For this to work the loop counter must be a 32 bit value (int,
  319.      long, unsigned int, unsigned long), the body of the loop must
  320.      not contain any conditional code.
  321.  
  322.      This feature can be disabled by using the pragma
  323.      "ppc_unroll_speculative"
  324.  
  325.      #pragma ppc_unroll_speculative off
  326.  
  327.      The unroll factor for speculative unrolling will be a power of
  328.      2 (so if unroll factor limit is 10, it will try 8, 4 and 2).
  329.  
  330.    + Loops containing a single conditional which is loop invariant
  331.      are unswitched:
  332.  
  333.      for (i = init; i < limit; i++) {
  334.          ... pre if statements ...
  335.          if (loop-invariant-expression) {
  336.              ... true statements ...
  337.          } else {
  338.              ... false statements ...
  339.          }
  340.          ... post if statements ...
  341.      }
  342.  
  343.      becomes:
  344.  
  345.      if (loop-invariant-expression) {
  346.         for (i = init; i < limit; i++) {
  347.             ... pre if statements ...
  348.             ... true statements ...
  349.             ... post if statements ...
  350.         }
  351.      } else {
  352.          for (i = init; i < limit; i++) {
  353.              ... pre if statements ...
  354.              ... false statements ...
  355.              ... post if statements ...
  356.          }
  357.      }
  358.  
  359.    + Treat as counting loops those loops where the condition is BNE
  360.      provided the increment is 1 or -1.
  361.  
  362.    + Improve handling of induction variables, detect nested induction
  363.      variables which can be merged
  364.  
  365.      int a[10][10];
  366.  
  367.      for (i = 0; i < 10; i++) {
  368.          for (j = 0; j < 10; j++) {
  369.               a[i][j]
  370.          }
  371.      }
  372.  
  373.      detect that a[i][j] is a single induction variable (instead of
  374.      two (a[i], and a[i][j])). This only works if the loop is over
  375.      all elemements of the first subscript (otherwise the value of
  376.      a[i] needs to be recomputed at the beginning of the inner loop).
  377.  
  378.      Also detect induction variables which are simple offsets from
  379.      each other (like fields of a structure). If possible update
  380.      the load/store instructions to use a single induction variable
  381.      with the offsets encoded into the load/store instruction.
  382.  
  383.    + Extended Constant Propagation to handle ADD => ADDI, OR => ORI,
  384.      SUB => ADDI or SUBFIC (depending on which paramter is constant).
  385.      (These patterns were handled in the peephole, but Constant
  386.      Propagation works across blocks).
  387.  
  388.    + ADDI ... Load/Store; when ever possible the constant part of an
  389.      ADDI is propagated into the Load/Store instruction, and the ADDI
  390.      is defered as late in the basic block as possible. For example
  391.  
  392.      int *p;
  393.  
  394.      *p++ = 0; *p++ = 0; *p++ = 0; *p++ = 0;
  395.  
  396.      Produces something like:
  397.  
  398.      LI     R0,0
  399.      STW    R0,0(Rp)
  400.      ADDI   Rp,Rp,4
  401.      STW    R0,0(Rp)
  402.      ADDI   Rp,Rp,4
  403.      STW    R0,0(Rp)
  404.      ADDI   Rp,Rp,4
  405.      STW    R0,0(Rp)
  406.      ADDI   Rp,Rp,4
  407.  
  408.      This is now optimized to:
  409.  
  410.      LI     R0,0
  411.      STW    R0,0(Rp)
  412.      STW    R0,4(Rp)
  413.      STW    R0,8(Rp)
  414.      STW    R0,12(Rp)
  415.      ADDI   Rp,Rp,12
  416.  
  417.      When possible the last add will be deleted if the value is not live,
  418.      if the value is live and the ADDI can be folded into the last Load
  419.      or Store the update form of the load/store will be used. This general
  420.      optimization will work on other forms (so *--p, *++p etc will be
  421.      handled).
  422.  
  423.    + Peephole optimizer now keeps track of the usage of condition code
  424.      fields so that compares when the result would be constant can be
  425.      removed. In the following example the BEQ can become a "B" or be
  426.      deleted, in addition the CMP (and perhaps the LI) can be deleted
  427.      if their results are not live.
  428.  
  429.      LI Rx,k; CMP[L]I CRx,Rx,l; B[EQ|NE] CRx,label
  430.      ==>
  431.      if branch condition is true:
  432.         B label
  433.      if branch condition is false:
  434.         B nextblock
  435.  
  436.      *Note if the branch is to the next block the final assembly pass
  437.       will optimize the branch away
  438.  
  439.    + Added peephole patterns:
  440.      LBZX Ry,(Rx,Rw); RLWINM Rz,Ry,0,a,31; => LBZX Rz,(Rx,Rw)
  441.      iff a <= 24, and Ry is not live after the RLWINM
  442.  
  443.      LHZX Ry,(Rx,Rw); RLWINM Rz,Ry,0,a,31; => LHZX Rz,(Rx,Rw)
  444.      iff a <= 16, and Ry is not live after the RLWINM
  445.  
  446.      NOT Ry,Rx; AND Rz,Rw,Ry => ANDC Rz,Rw,Rx
  447.      iff Ry is not live after the ADN.
  448.  
  449.    + Extensive improvements for ADDI ... Load/Store patterns
  450.  
  451.  
  452. ========================================================================
  453. Bugs Fixed in This Version
  454. ========================================================================
  455.  
  456. MWC68K, MWLink68K, and MWDump68K
  457. *  the -palmos option has been reenabled.  It was accidentally disabled
  458.    in version 2.1.
  459.  
  460.  
  461. MWC68K and MWCPPC
  462. *  the compiler no longer accepts return types in conversion functions
  463.  
  464. *  the compiler no longer accepts non-member conversion functions
  465.  
  466. *  fixes a bug with binding temporaries to non-const references during
  467.    overload matching
  468.  
  469. *  the C++ compiler no longer allows implicit conversions from constant
  470.    enumeration expressions to a pointer type.
  471.  
  472. *  unnamed namespace members no longer require a prototype when the
  473.    "require function prototype" option is selected.
  474.  
  475. *  the compiler no longer generates 'implicit arithmetic conversion'
  476.    warnings when the left side of an assignment is a bitfield.
  477.  
  478. *  functions that are defined inside of an Objective C class
  479.    implementation now have access to private and protected members.
  480.  
  481. *  fixes a qualified non-static member compile-time access bug in
  482.    certain class trees with nested qualified base classes.
  483.  
  484. *  fixes a bug with reinterpret reference casts
  485.  
  486. *  fixes a preprocessor bug with 'defined' in macros that are expanded
  487.    inside of #if and #elif expressions
  488.  
  489. *  fixes a dynamic initialization bug where static template class members
  490.    where initialized more than once (MW05797).
  491.  
  492. *  fixes a template class instance bug in SYM files (MW07582).
  493.  
  494. *  fixes some bugs with throwing and catching:
  495.  
  496.       const/volatile pointer/reference types
  497.       ambiguous, local, and/or non-public base classes
  498.       'void' pointers.
  499.       non-trivial virtual base classes (BR6787)
  500.  
  501. *  multiple using declarations are now accepted
  502.  
  503.         namespace N {
  504.             typedef int T;
  505.             typedef int T;  //  OK
  506.         }
  507.         using N::T;
  508.         using N::T; //  also OK
  509.  
  510. *  fixes a bug with class-type conditional declarations (MW03054).
  511.  
  512. *  non-const or non-lvalue class objects can no longer be assigned
  513.    using a non-const assignment operator (eg X& operator(X&))
  514.  
  515. *  fixes a bug with packed 1-byte ANSI C unions
  516.  
  517.  
  518. MWC68K
  519. *  MW07038 - Internal compiler error : File 'IroLoop.c' Line 3354. 
  520.                 Previous workaround was to turn off Reduction in Strength
  521.                 optimization.
  522.  
  523. *  MW07444 - Bug in the IR optimizer.
  524.  
  525. *  fixes an "illegal use of alloca() in function argument" error
  526.    message bug.
  527.  
  528. *  fixes a struct return bug with member functions where the class
  529.    is a trivial temporary object.
  530.  
  531.  
  532. MWCPPC
  533. *  MW09350: Unrolling loops which contain a conditional
  534.    expression which has a "continue" (or no else and code
  535.    after the conditional part of the if):
  536.    
  537.    for (i = 0; i < 4; i++) {
  538.       if (cond || cond) {
  539.       
  540.       }
  541.    }
  542.  
  543. *  MW09249: in constant propagation incorrectly converted
  544.  
  545.    LI Rx,0; ... SUBF Rz,Ry,Rx ===>>> MR Rz,Rx
  546.    
  547.    it should have been
  548.    
  549.    NEG Rz,Rx
  550.  
  551. *  MW09181: counting loop with post decrement (or increment) when
  552.    converting the loop (because it is known that the loop will always
  553.    be executed once) the instructions following the compare where not
  554.    copied into the "preheader".
  555.  
  556. *  MW09120 PowerPlant project won't link with PPC compiler 2.2 build 27
  557.    The optimizer detected an invariant conditional in a loop and
  558.    unswitched the loop, however the loop contained a call (which meant
  559.    that there is little if any improvement with unswitching) and the loop
  560.    was converted in such a way as to confuse the scheduler. The code now
  561.    checks for calls (and instructions with side effects).
  562.  
  563. *  MW09048: Re : BUG - C++ PPC 2.2b1 + optimizations
  564.    Fixed a bug in speculative loop unrolling when the loop counter
  565.    was not 1 and the loop counter is not referenced in the loop body.
  566.  
  567. *  Fixed a bug handling the pattern
  568.    ADD rX,rY,rZ; ADDI rW,rX,0 ==> ADD rW,rY,rZ
  569.  
  570. *  MW08931 Out-of-line traceback tables causes ICE
  571.  
  572. *  MW08861 fixes a bug which prevented disabling puttting small static
  573.    data in the TOC.
  574.  
  575. *  MW08762, MW08727 - PPC backend's parser for pragmas was incorrectly
  576.    complaining about missing EOL after unknown pragmas
  577.    
  578. *  MW08761 - Incorrect internal error when trying to optimize small
  579.    local arrays to registers.
  580.  
  581. *  MW08611 - fixes a bug in structure copy using doubles (when one of the
  582.    operands being copied is an array reference).
  583.  
  584. *  MW08481 - fixes a bug in copy propagation which was confusing the offsets
  585.    of parameters (only effects parmeters not passed in registers)
  586.  
  587. *  fixes a bug in global register allocation at optimization level 2
  588.    (with only the global optimizer "Speed" checkbox set). This bug
  589.    only effects C++ functions with a inlined function which has to
  590.    destroy an object in response to an exception (and even then only
  591.    for some rare cases).
  592.  
  593. *  Handle a conditional expression where one of the values is a throw:
  594.  
  595.    var = expr ? value : throw error;
  596.  
  597. *  Fix the parameter types on __memcpy() and __strcpy()
  598.  
  599. *  Handle using !varaible as a paramter so it only generates
  600.    two instructions (instead of 4).
  601.  
  602. *  MW07222 - incorrect handling of "++"
  603.  
  604. *  MW07294 - internal error in CExpr.c for a template expansion
  605.  
  606. *  MW05522 - internal compiler error in IroLoop.c Line 3354
  607.  
  608. *  MW07014 - float op= float
  609.  
  610. *  MW07015 - float = int * float
  611.  
  612. *  MW07164 - Internal Error Operands.c line 648
  613.  
  614. *  MW07345 - Try/catch wrongly optimized away
  615.  
  616. *  MW06832 - internal compiler error: File: 'IroLoop.c' Line: 3354
  617.  
  618. *  MW06770 - internal compiler error: File: 'Operands.c' Line: 648
  619.  
  620. *  MW07242 - In some cases, PPC Global Optimizer eliminates variables that
  621.             are still needed
  622.  
  623. *  MW07014,MW07015 - loop code was detecting a float induction variable 
  624.     and not handling it correctly.
  625.  
  626. *   MW07345 - Common Subexpression Elimination has been fixed to not lose 
  627.     the catch block.
  628.  
  629. *  MW05562 - compiler error for volatile classes
  630.  
  631. *  MW06809 - >>= of 16-bit value shifts in bits from upper word
  632.  
  633. *  MW07037 - Bug report, part II
  634.  
  635. *  MW07080 - won't compile
  636.  
  637. *  MW07268 - incorrect handling of shift on byte values
  638.  
  639. *  MW07284 - Load Byte Reversed instructions are not treated as volatile
  640.  
  641. *  MW07315 - invalid disassembly
  642.  
  643. *  MW07395 - With Full Optimizations Compiler emits extra round to single
  644.     instuctions
  645.  
  646. *  MW05562 - When fixing volatile allowances were made for supporting the 
  647.     expression:
  648.  
  649.     *(volatile int *) x;
  650.  
  651.     Which might be used to toggle an IO location and where the read should
  652.     not be optimized away. Since the values was never assigned to a variable
  653.     the PowerPC compiler would never actually load the value. In 2.1 (Pro 3)
  654.     it forces the value to be loaded, but it did not check that the value
  655.     actually was loadable. The way it does the load did not work for structs
  656.     or classes. The backend now only loads basic "C" types (int, char, float,
  657.     double) for this type of expression it will not load a class (or struct
  658.     or union...).
  659.  
  660. *  MW06809, MW07268 - The 2.1 (Pro 3) PowerPC code generator changed the way 
  661.     that it handled "op=" expressions, this change while generally better 
  662.     required some changes in the intermedate code to insure that values were 
  663.     correct after the assignment.
  664.  
  665. *  MW07037 - Not reproduceable with iPro 4 (2.1.1).
  666.  
  667. *  MW07080 - Not reproduceable with iPro 4 (2.1.1).
  668.  
  669. *  MW07284 - As of iPro 4 (2.1.1) __lwbrx(), __lhbrx(), __sthbrx(), __stwbrx() 
  670.     are treated as having side effects and will never be optimized away.
  671.  
  672. *  MW07315 - The 68K version of the PowerPC disassembler was built incorrectly, 
  673.     and was not working correctly.
  674.  
  675. *  MW07395 - Compiler when doing copy propagation was adding an unneeded type 
  676.     conversion (this conversion is needed for some arch cpus but not PowerPC):
  677.  
  678.     float bug(float *fp, float s, float o)
  679.     {
  680.         float f, r;
  681.  
  682.         f = *fp;
  683.         r = f * s + o;
  684.         return r;
  685.     }
  686.  
  687.     The compiler optimized this to:
  688.  
  689.     float bug(float *fp, float s, float o)
  690.     {
  691.         return (float) ((float)*fp) * s + o;
  692.     }
  693.  
  694.     The extra float casting is needed for some non PowerPC CPUs (because of
  695.     the way that float registers are handled). In the PowerPC case they were
  696.     not needed. The code generator now ignores unneeded requests to convert
  697.     from a float to a float.
  698.  
  699. *  MW07612 - built-in assembler bug fix
  700.  
  701.  
  702. ========================================================================
  703. Known Bugs and Incompatibilities
  704. ========================================================================
  705.  
  706. *  None.
  707.  
  708.  
  709. ========================================================================
  710. Contacting Metrowerks
  711. ========================================================================
  712.  
  713. For bug reports, technical questions, and suggestions, please use the
  714. forms in the Release Notes folder on the CD, and send them to
  715.  
  716. support@metrowerks.com
  717.  
  718. See the CodeWarrior on the Nets document in the Release Notes folder for
  719. more contact information, including a list of Internet newsgroups, 
  720. online services, and patch and update sites.
  721.  
  722. ========================================================================
  723.  
  724. Metrowerks Corporation
  725.